home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d21 / apishare.arc / SHAREA.C < prev    next >
Text File  |  1988-10-22  |  4KB  |  156 lines

  1. /****************************************************************
  2. *
  3. *  Name:          SHAREA
  4. *
  5. *  Function:      share memory/data with another process
  6. *
  7. *  Shows how to:  1. allocate and deallocate shared memory.
  8. *                 2. read from and write to shared memory.
  9. *                 3. mail to another process the address of shared data.
  10. *                 4. control access to shared data via mailbox semaphore.
  11. *
  12. ****************************************************************/
  13.  
  14. #include <stdio.h>
  15. #include "dvapi.h"
  16.  
  17. /* minimum API version required */
  18. #define required 0x201
  19. #define piflen 416
  20.  
  21. /* API version number */
  22. int version;
  23.  
  24. /* default object handle */
  25. ulong win;
  26.  
  27. /* PIF-related variables */
  28. FILE *fp,*fopen();
  29. char dvpbuf[piflen];
  30.  
  31. /* application handle of other process */
  32. ulong apphanb;
  33.  
  34. /* type declarations related to shared data */
  35. typedef char *DATATYPE;
  36. typedef DATATYPE *DATAPTR;
  37.  
  38. /* constant value to be assigned to shared memory */
  39. DATATYPE shrconst = "AAAAA     ";
  40.  
  41. /* pointer to shared data */
  42. DATAPTR shrptr;
  43.  
  44. /* mailbox semaphore controlling access to shared memory */
  45. ulong sema;
  46.  
  47. /* global name of mailbox */
  48. char *name = "Shared Memory Semaphore";
  49.  
  50.  
  51. /**********************************************************************
  52. *  main  -  check for DESQview present and enable required extensions.
  53. ***********************************************************************/
  54.  
  55. main () {
  56.   /* initialize C interfaces and get API version number */
  57.   version = api_init();
  58.  
  59.   /* if DESQview is not running or version is too low, display a message */
  60.   if (version < required) {
  61.     printf ("This program requires DESQview version %d.02%d or later.\n",
  62.              required/256,required%256);
  63.     }
  64.  
  65.   else {
  66.  
  67.     /* tell DESQview what extensions to enable and start application */
  68.     api_level (required);
  69.     program_body();
  70.  
  71.     /* disable C interfaces and return from program */
  72.     api_exit();
  73.     }
  74.  
  75.   }
  76.  
  77.  
  78. /********************************************************************
  79. /*  program_body
  80. /*
  81. /*  Set up named mailbox semaphore.  Start other process.  Allocate
  82. /*  & initialize shared memory.  Mail pointer to shared data.
  83. /*  Continuously read, display and modify contents of shared data.
  84. /********************************************************************/
  85.  
  86. program_body () {
  87.  
  88.   /* get object handle */
  89.   win = win_me();
  90.  
  91.   /* create & name mailbox semaphore */
  92.   sema = mal_new();
  93.   mal_name (sema,name,sizeof (name));
  94.  
  95.   /* disallow closing of window */
  96.   win_disallow (win,ALW_CLOSE);
  97.  
  98.   /* read other process' dvp file into buffer area */
  99.   fp = fopen ("SB-PIF.DVP","rb");
  100.   fread (dvpbuf,piflen,1,fp);
  101.   fclose (fp);
  102.  
  103.   /* start other process & get its task handle */
  104.   apphanb = app_start (dvpbuf,piflen);
  105.  
  106.   /* allocate shared memory & get its buffer pointer */
  107.   /* Api_getmem normally allocates "system memory" from within the
  108.   /* "process memory" pool.  Such system memory is not shareable among other
  109.   /* processes.  Instead, if system memory were to be allocated from the
  110.   /* "shared memory" pool then system memory would be shareable among other
  111.   /* processes.  In other words, all processes that use shared memory have
  112.   /* access to each others' system memory.  Placing a single asterisk (*)
  113.   /* in the Shared Memory Pathname field of the PIF file will accomplish this.
  114.   /* See Chapter 16: Memory Management of the API Reference Manual. */
  115.   shrptr = api_getmem (sizeof (shrconst));
  116.  
  117.   /* copy initial data into shared memory */
  118.   strcpy(*shrptr,shrconst);
  119.  
  120.   /* mail to other process the pointer to shared data */
  121.   mal_write (mal_of (apphanb),shrptr,sizeof (shrptr));
  122.  
  123.   /* begin critical region */
  124.   api_beginc();
  125.  
  126.   /* loop till handle of other process is no longer valid */
  127.   while (api_isobj (apphanb)) {
  128.  
  129.     /* lock semaphore */
  130.     mal_lock (sema);
  131.  
  132.     /* read & display current contents & address of shared data */
  133.     win_printf (win,"%s at %Fp\n",*shrptr,*shrptr);
  134.  
  135.     /* modify contents of shared data */
  136.     strcpy (*shrptr,shrconst);
  137.  
  138.     /* unlock semaphore */
  139.     mal_unlock (sema);
  140.  
  141.     /* end critical region */
  142.     api_endc();
  143.  
  144.     /* begin critical region */
  145.     api_beginc();
  146.     }
  147.  
  148.   /* free allocated shared memory */
  149.   api_putmem (shrptr);
  150.  
  151.   /* allow closing of window */
  152.   win_allow (win,ALW_CLOSE);
  153.  
  154.   /* free allocated object */
  155.   mal_free (sema);
  156.   }